package com.leyou.user.controller;

import com.leyou.test.exceptions.LyException;
import com.leyou.user.dot.UserDTO;
import com.leyou.user.entity.User;
import com.leyou.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.stream.Collectors;

@RestController  //返回值都为json
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 根据参数中的用户名和密码查询指定用户并且返回用户
     * @param username   用户名
     * @param password   密码
     * @return   用户的json格式
     */
    @GetMapping("/query")
    public ResponseEntity<String> queryUserByUsernameAndPassword(
            @RequestParam("username") String username,
            @RequestParam("password") String password
    ) {
        return ResponseEntity.ok(userService.queryUserByUsernameAndPassword(username, password));
    }

    /**
     * 用户注册
     *
     * @param user 表单提交数据
     * @param code 手机验证码
     * @param bindingResult 我们在User参数后面跟一个BindingResult参数，不管校验是否通过，都会进入方法内部
     * @return 无
     */
    @PostMapping("/register")
    public ResponseEntity<Void> register(@Valid User user, BindingResult bindingResult, @RequestParam("code") String code) {
        //如果有校验异常
        if (bindingResult.hasErrors()) {
            //搜集所有错误信息
            String msg = bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining("|"));
            throw new LyException(400, msg);
        }
        //调用service
        userService.register(user, code);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /**
     * 生成短信验证码
     *
     * @param phone 用户手机号码
     * @return 无返回值
     */
    @PostMapping("/code")
    public ResponseEntity<Void> sendCode(String phone) {
        userService.sendCode(phone);
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
    }

    /**
     * 实现用户数据的校验
     *
     * @param data 要校验的数据
     * @param type 要校验的数据类型：1，用户名；2，手机
     * @return 返回结果  查不到:true;能查到:false
     */
    @GetMapping("/check/{data}/{type}")
    public ResponseEntity<Boolean> checkUserData(
            @PathVariable("data") String data,
            @PathVariable("type") Integer type
    ) {
        return ResponseEntity.ok(userService.checkUserData(data, type));
    }
}
